package com.linkgie.galaxyframework.crypto.spi;

/**
 * 签名操作；
 * 
 * @author liso
 *
 */
public interface SignatureFuncSPI extends AsymmetricFuncSPI {

	/**
	 * 对数据签名；
	 * 
	 * @param privKey 私钥；
	 * @param data    要签署的数据；
	 * @return
	 */
	default Signaturebytes sign(PrivateKeybytes privKey, byte[] data) {
		return sign(privKey, data, 0, data.length);
	}

	/**
	 * 对数据签名；
	 * 
	 * @param privKey 私钥；
	 * @param data    要签署的数据；
	 * @param offset
	 * @param length
	 * @return
	 */
	Signaturebytes sign(PrivateKeybytes privKey, byte[] data, int offset, int length);

	/**
	 * 对数据签名；
	 * 
	 * @param rawPrivKey 未编码的原始私钥；
	 * @param data    要签署的数据；
	 * @return 未编码的原始签名；
	 */
	default byte[] sign(byte[] rawPrivKey, byte[] data) {
		return sign(rawPrivKey, data, 0, data.length);
	}
	
	/**
	 * 对数据签名；
	 * 
	 * @param rawPrivKey 未编码的原始私钥；
	 * @param data    要签署的数据；
	 * @param offset
	 * @param length
	 * @return 未编码的原始签名；
	 */
	byte[] sign(byte[] rawPrivKey, byte[] data, int offset, int length);

	/**
	 * 验证签名；
	 * 
	 * @param signature
	 * @param pubKey
	 * @param data
	 * @return
	 */
	default boolean verify(Signaturebytes signature, PublicKeybytes pubKey, byte[] data) {
		return verify(signature, pubKey, data, 0, data.length);
	}

	/**
	 * 验证签名；
	 * 
	 * @param signature
	 * @param pubKey
	 * @param data
	 * @param offset
	 * @param length
	 * @return
	 */
	boolean verify(Signaturebytes signature, PublicKeybytes pubKey, byte[] data, int offset, int length);
	
	/**
	 * 验证签名；
	 * 
	 * @param rawSignature 未编码的原始签名；
	 * @param rawPubKey	未编码的原始公钥；
	 * @param data
	 * @return
	 */
	default boolean verify(byte[] rawSignature, byte[] rawPubKey, byte[] data) {
		return verify(rawSignature, rawPubKey, data, 0, data.length);
	}
	
	/**
	 * 验证签名；
	 * 
	 * @param rawSignature 未编码的原始签名；
	 * @param rawPubKey	未编码的原始公钥；
	 * @param data
	 * @param offset
	 * @param length
	 * @return
	 */
	boolean verify(byte[] rawSignature, byte[] rawPubKey, byte[] data, int offset, int length);

	/**
	 * 创建签名生成器；
	 * 
	 * @param privateKey 私钥；
	 * @return
	 */
	DigestGenerator<Signaturebytes> createSigner(PrivateKeybytes privKey);

	/**
	 * 创建签名验证器；
	 * 
	 * @param signature 签名；
	 * @param pubKey    公钥；
	 * @return
	 */
	DigestGenerator<Boolean> createVerifier(Signaturebytes signature, PublicKeybytes pubKey);
}
